#!/usr/bin/env python2.4
# -*- coding: utf-8 -*-

from __init__ import FConfig
import xmltv
import os
import cPickle
from datetime import datetime


# puit de donnee pour les prog tv
# { "m6":{datetime:(duree,title),datetime:(duree,title),...},"mtv":...}
__progs={}

# nom du fichier de cache (localise par rapport a ce fichier)
__pickle=os.path.join(FConfig.CACHEDIR,"progtv.data")

#===============================================================================
def init(file,callback=None):
#===============================================================================
    """
    initialise le module, avec le fichier xmltv "file"
    (systeme de cache, via pickle, pour optimiser les acces)

    callback peut être une fonction appele si la generation doit avoir lieu
    (utile pour prevenir la generation ;-)
    """
    global __progs

    date_xmltv = datetime.fromtimestamp(os.path.getmtime( file ))
    if os.path.isfile(__pickle):
        date_progtv = datetime.fromtimestamp(os.path.getmtime( __pickle ))
    else:
        date_progtv = datetime(1970,1,1)

    if date_xmltv > date_progtv:
        #le fichier xmltv est plus recent que le pickle
        #il faut le regenerer
        def cd2d(f): #yyyymmddhhiiss -> datetime
            return datetime(int(f[:4]),int(f[4:6]), int(f[6:8]),
                            int(f[8:10]),int(f[10:12]),int(f[12:14]))

        if callback: callback()

        print "Traitement du fichier ",file
        chaines={}
        for i in xmltv.read_channels(open(file, 'r')):
           key= i["display-name"][0][0]
           val= i["id"]
           chaines[val]=key

        data=xmltv.read_programmes(open(file, 'r'))
        __progs={}
        for i in data:
           chaine= chaines[i["channel"]]
           date=cd2d(i["start"])

           if chaine not in __progs:
               __progs[chaine]={}
           __progs[chaine][date]=((cd2d(i["stop"])-date).seconds/60,i["title"][0][0])

        cPickle.dump(__progs,open(__pickle,'w'))
    else:
        # le xmltv n'a pas besoin d'etre reparser
        # on prends le pickle
        __progs=cPickle.load(open(__pickle))

#===============================================================================
def isAvailable():
#===============================================================================
    return len(__progs.keys())>0

#===============================================================================
def isPresent(chaine,date=None):
#===============================================================================
    """
    verifi la presence de la "chaine", ou du couple "chaine,date" dans notre bdd
    """
    global __progs

    if __progs:
        if chaine in __progs.keys():
            if date:
                for d in __progs[chaine]:
                    if d.strftime("%Y%m%d") == date.strftime("%Y%m%d"):
                        return True
            else:
                return True
    return False


#===============================================================================
def aff():
#===============================================================================
    """ fait un affichage de toute les chaines, et leurs dates presentes
    """
    global __progs
    if __progs:
        for i in __progs.keys():
           t=[]
           for date in __progs[i]:
               d=date.strftime("%Y%m%d")
               if d not in t:
                   t.append(d)

           print i,sorted(t)
    else:
        print "pas de prog tv"



#===============================================================================
def getProgs(chaine,date):
#===============================================================================
    """ retourne une liste de tuple (datetime,duree(min),titre )
        pour la chaine 'chaine' à la date 'date'
    """
    global __progs
    liste=[]

    if __progs:
        if chaine in __progs.keys():
            dico={}
            for d in __progs[chaine]:
                if d.strftime("%Y%m%d") == date.strftime("%Y%m%d"):
                    dico[d]=__progs[chaine][d]
            li = dico.keys()
            li.sort()
            liste = [(i,dico[i][0],dico[i][1]) for i in li]

    return liste




#===============================================================================
def matchFbx():
#===============================================================================
    import dict4ini
    from fbx import getStreams,convChaine

    cfg = dict4ini.DictIni(os.path.join(os.environ['HOME'],'.fricorder'))

    # initialise le progtv, si il est defini dans le ~/.fricorder
    if not (cfg.config.xmltv and os.path.isfile(cfg.config.xmltv)):
        print "Vous n'avez pas specifier de cle 'xmltv' dans la section 'common' de votre ~/.fricorder"
    else:
        # detection des matchages freebox/progTV
        #==========================================================================
        print 79*"-"
        print "votre fichier XMLTV '%s', contient les chaines suivantes (et leur mappage sur les chaines freebox) :" % cfg.config.xmltv
        print 79*"-"

        init(cfg.config.xmltv)

        #recupere la liste des chaines freebox
        liste_fbx=[chaine for num,chaine,stream in getStreams() ]

        for i in __progs.keys():
            chaine_tv=i.encode("utf_8")
            map=[]
            for chaine_fbx in liste_fbx:
                if chaine_tv == convChaine(chaine_fbx):
                    map.append(chaine_fbx)

            for i in map:
                liste_fbx.remove(i)

            print " - '%s'" % chaine_tv,map or ""

        print
        print 79*"-"
        print "Les chaines freebox suivantes n'auront pas le programme tv de dispo :"
        print 79*"-"
        for i in liste_fbx:
            print " - '%s'"%i

        # detection des jours disponibles
        #==========================================================================
        print 79*"-"
        print "Liste des dates dispos dans votre fichier xmltv:"
        print 79*"-"
        aff()


#===============================================================================
def test():
#===============================================================================
    def info():
        print "gen gen gen !!!!!!"

    init("tv.xml",info)

    date=datetime(2006,1,6)
    print isPresent("mtv",date)
    print isPresent("cnn")

    for h,d,t in getProgs("mtv",date):
        print h,d,t


if __name__ == "__main__":
    #~ test()
    matchFbx()
